home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / lfsrebuild / fscheck.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-12  |  9.5 KB  |  267 lines

  1. /* 
  2.  * fscheck.h
  3.  *
  4.  *    Types for the file system check program.
  5.  *
  6.  * Copyright (C) 1986 Regents of the University of California
  7.  * All rights reserved.
  8.  *
  9.  * $Header: /user2/mendel/lfs/src/cmds/fscheck/RCS/fscheck.h,v 1.17 90/10/10 15:29:07 mendel Exp Locker: mendel $ SPRITE (Berkeley)
  10.  */
  11.  
  12. #ifndef _FSCHECK
  13. #define _FSCHECK
  14.  
  15. #ifdef __STDC__
  16. #define _HAS_PROTOTYPES
  17. #endif
  18. #include <cfuncproto.h>
  19. #include <disk.h>
  20. #include <sys/types.h>
  21. #include <varargs.h>
  22. #include <stdio.h>
  23. #include <errno.h>
  24. #include <stdlib.h>
  25. #include <time.h>
  26. #include <sys/time.h>
  27. #include <alloca.h>
  28. #include <bstring.h>
  29.  
  30. #include <kernel/lfsDesc.h>
  31. #include <kernel/lfsDescMap.h>
  32. #include <kernel/lfsFileLayout.h>
  33. #include <kernel/lfsDirOpLog.h>
  34. #include <kernel/lfsSegLayout.h>
  35. #include <kernel/lfsStableMem.h>
  36. #include <kernel/lfsSuperBlock.h>
  37. #include <kernel/lfsUsageArray.h>
  38. #include <kernel/lfsStats.h>
  39.  
  40. /*
  41.  *  fscheck Proc_Exit status codes.
  42.  *     Codes < 0 are hard errors. Codes > 0 are soft errors.
  43.  *
  44.  */
  45. #define EXIT_OK        (char) 0
  46.  
  47. #define EXIT_SOFT_ERROR        (char) 1
  48. #define EXIT_OUT_OF_MEMORY    (char) 2
  49. #define EXIT_NOREBOOT        (char) 3
  50. #define EXIT_REBOOT        (char) 4
  51.  
  52. #define EXIT_HARD_ERROR        (char) -1
  53. #define EXIT_READ_FAILURE    (char) -2
  54. #define EXIT_WRITE_FAILURE    (char) -3
  55. #define EXIT_BAD_ARG        (char) -4
  56. #define EXIT_MORE_MEMORY    (char) -5
  57. #define EXIT_DISK_FULL        (char) -6
  58.  
  59. /*
  60.  * Structure kept for each file descriptor.
  61.  */
  62. typedef struct FdInfo {
  63.     int        addr;
  64.     int        timestamp;
  65.     unsigned short truncVersion; 
  66.     short    flags;        /* Flags defined below. */
  67.     short    origLinkCount;    /* Link count from the file descriptor. */
  68.     short    newLinkCount;    /* Link computed by checkFS. */
  69. } FdInfo;
  70.  
  71. /*
  72.  * Flag values.
  73.  *
  74.  *    IS_A_DIRECTORY    This file is a directory.
  75.  *    FD_REFERENCED    This file is referenced by a directory.
  76.  *    FD_MODIFIED    This file descriptor has been modified.
  77.  *    FD_SEEN        This file descriptor has already been checked.
  78.  *    FD_ALLOCATED    This file descriptor is allocated.    
  79.  *    ON_MOD_LIST    This file descriptor is on the modified list.
  80.  *    FD_UNREADABLE    This file descriptor is in an unreadable sector.
  81.  *    FD_RELOCATE    This file descriptor is in a readable sector in
  82.  *            an unreadable block and is being relocated.
  83.  */
  84. #define    IS_A_DIRECTORY    0x01
  85. #define    FD_REFERENCED    0x02
  86. #define    FD_MODIFIED    0x04
  87. #define    FD_SEEN        0x08
  88. #define    FD_ALLOCATED    0x10
  89. #define    ON_MOD_LIST    0x20
  90. #define    FD_UNREADABLE    0x40
  91. #define    FD_RELOCATE    0x80
  92.  
  93. /*
  94.  * Structure for each element of the list of modified file descriptors.
  95.  */
  96. typedef struct ModListElement {
  97.     List_Links        links;
  98.     int            fdNum;
  99.     Fsdm_FileDescriptor    *fdPtr;
  100. } ModListElement;
  101. extern    List_Links    modListHdr;
  102. #define    modList &modListHdr
  103.  
  104. /*
  105.  * Structure for each element of the list of relocating file descriptors.
  106.  * Note that it looks like a ModListElement with an extra file descriptor
  107.  * number at the end.  It can be inserted into the modList and written
  108.  * in location newFdNum once newFdNum has been assigned.
  109.  */
  110. typedef struct RelocListElement {
  111.     List_Links        links;
  112.     int            newFdNum;
  113.     Fsdm_FileDescriptor    *fdPtr;
  114.     int            origFdNum;
  115. } RelocListElement;
  116. extern    List_Links    relocListHdr;
  117. #define    relocList &relocListHdr
  118.  
  119. typedef enum {
  120.     DIRECT, 
  121.     INDIRECT, 
  122.     DBL_INDIRECT
  123. } BlockIndexType;
  124.  
  125. typedef enum {
  126.     FD, 
  127.     BLOCK, 
  128. } ParentType;
  129.  
  130. /*
  131.  * Structure for each element of the list of file blocks that need to be copied.
  132.  */
  133.  
  134. typedef struct CopyListElement {
  135.     List_Links        links;
  136.     BlockIndexType    blockType;
  137.     short        fragments;
  138.     int            index;
  139.     ParentType        parentType;
  140.     int            parentNum;
  141.     Fsdm_FileDescriptor    *fdPtr;
  142. } CopyListElement;
  143.  
  144. extern    List_Links    copyListHdr;
  145. #define    copyList ©ListHdr
  146.  
  147.  
  148. /*
  149.  * Structure to contain the current state about a block index.
  150.  */
  151.  
  152.  
  153. typedef struct DirIndexInfo {
  154.     FdInfo         *fdInfoPtr;         /* Status info about the file 
  155.                           * descriptor being read. */
  156.     Fsdm_FileDescriptor *fdPtr;                  /* The file descriptor being
  157.                         read. */
  158.     BlockIndexType indexType;             /* Whether chasing direct, 
  159.                         indirect, or doubly indirect 
  160.                         blocks. */
  161.     int         blockNum;             /* Block that is being read, 
  162.                         written, or allocated. */
  163.     int         blockAddr;             /* Address of directory block
  164.                         to read. */
  165.     int         dirOffset;             /* Offset of the directory entry 
  166.                         that we are currently examining 
  167.                         in the directory. */
  168.     char     dirBlock[FS_BLOCK_SIZE];    /* Where directory data is 
  169.                         stored. */
  170.     int         numFrags;             /* Number of fragments stored in
  171.                         the directory entry. */
  172.     int         firstIndex;             /* An index into either the direct
  173.                             block pointers or into an 
  174.                             indirect block. */
  175.     int         secondIndex;             /* An index into a doubly indirect
  176.                             block. */
  177.     char      firstBlock[FS_BLOCK_SIZE];  /* First level indirect block. */
  178.     int         firstBlockNil;             /* The first level block is 
  179.                         empty.*/
  180.     char      secondBlock[FS_BLOCK_SIZE]; /* Second level indirect block. */
  181.     int         secondBlockNil;         /* The second level block 
  182.                         is empty.*/
  183.     int         dirDirty;             /* 1 if the directory block is
  184.                         dirty. */
  185. } DirIndexInfo;
  186.  
  187. extern int    foundError;
  188. extern Boolean    tooBig;
  189. extern int    debug;
  190. extern int    writeDisk;
  191. extern int    verbose;
  192. extern    FdInfo        *descInfoArray;
  193. extern int DiskRead _ARGS_((int diskFd, int blockOffset, int bufferSize, 
  194.             char *bufferPtr));
  195. extern int DiskWrite _ARGS_((int diskFd, int blockOffset, int bufferSize, 
  196.             char *bufferPtr));
  197. extern char *GetStableMemEntry _ARGS_((ClientData clientData, int entryNumber));
  198.  
  199. extern int FetchFileDesc _ARGS_((int fdNum, Fsdm_FileDescriptor **fdPtrPtr));
  200. extern void StoreFileDesc _ARGS_((int fdNum, Fsdm_FileDescriptor *fdPtr));
  201. extern void CheckDirTree _ARGS_((int diskFd));
  202. extern void CheckDirEntry _ARGS_((int entryNum, register DirIndexInfo *dirIndexPtr, register Fslcl_DirEntry *dirEntryPtr));
  203. extern ReturnStatus MakeRoot _ARGS_((Ofs_DomainHeader *domainPtr, u_char *bitmapPtr, Fsdm_FileDescriptor *fdPtr));
  204. extern int strnlen _ARGS_((register char *string, int numChars));
  205. extern int MarkBitmap _ARGS_((int fdNum, int blockNum, unsigned char *bitmapPtr, int numFrags, Ofs_DomainHeader *domainPtr));
  206. extern int Output _ARGS_((int __builtin_va_alist));
  207. extern void OutputPerror _ARGS_((int __builtin_va_alist));
  208. extern void WriteOutputFile _ARGS_((FILE *stream, int flush));
  209. extern int CloseOutputFile _ARGS_((FILE *stream));
  210. extern void ExitHandler _ARGS_((void));
  211. extern void ClearFd _ARGS_((int flags, Fsdm_FileDescriptor *fdPtr));
  212. extern void AddToCopyList _ARGS_((ParentType parentType, Fsdm_FileDescriptor *fdPtr, int fdNum, int blockNum, int index, BlockIndexType blockType, int fragments, Boolean *copyUsedPtr));
  213. extern int main _ARGS_((int argc, char *argv[]));
  214. extern void CheckFilesystem _ARGS_((int firstPartFID, int partFID, int partition));
  215. extern void CheckBlocks _ARGS_((int partFID, Ofs_DomainHeader *domainPtr, int fdNum, Fsdm_FileDescriptor *fdPtr, unsigned char *newCylBitmapPtr, int *modifiedPtr, Boolean *copyUsedPtr));
  216. extern int ProcessIndirectBlock _ARGS_((int fdNum, int partFID, int lastBlock, Boolean duplicate, register Fsdm_FileDescriptor *fdPtr, int *blockNumPtr, unsigned char *newCylBitmapPtr, int *fileBlockNumPtr, int *dirtyPtr, int *lastRealBlockPtr, int *modifiedPtr, int *blockCountPtr, Boolean *copyUsedPtr));
  217. extern void RelocateFD _ARGS_((register Ofs_DomainHeader *domainPtr, FdInfo *descInfoPtr, RelocListElement *relocPtr));
  218. extern int CopyBlock _ARGS_((register Ofs_DomainHeader *domainPtr, FdInfo *descInfoPtr, int partFID, u_char *bitmapPtr, CopyListElement *copyPtr));
  219. extern int FillNewBlock _ARGS_((int blockNum, BlockIndexType blockType, int fragments, Fsdm_FileDescriptor *fdPtr, Ofs_DomainHeader *domainPtr, FdInfo *descInfoPtr, int partFID, u_char *bitmapPtr, int *newBlockNumPtr));
  220. extern Boolean LoadUsageArray _ARGS_((int diskFd, int checkPointSize, char *checkPointPtr));
  221. extern Boolean LoadDescMap _ARGS_((int diskFd, int checkPointSize, char *checkPointPtr));
  222. extern char *GetUsageState _ARGS_((LfsSegUsageEntry *entryPtr));
  223. extern int DiskRead _ARGS_((int diskFd, int blockOffset, int bufferSize, char *bufferPtr));
  224. extern char *GetStableMemEntry _ARGS_((ClientData clientData, int entryNumber));
  225.  
  226.  
  227. extern char *sbrk();
  228.  
  229.  
  230. #define Alloc(ptr,type,number) AllocByte((ptr),type,sizeof(type) * (number))
  231.  
  232. #define AllocByte(ptr,type,numBytes) { \
  233.     (ptr) = (type *) malloc((unsigned) (numBytes)); }
  234.  
  235. #define min(a,b) (((a) < (b)) ? (a) : (b) )
  236.  
  237. extern LfsSuperBlock    *superBlockPtr;
  238. extern int        currentTimestamp;
  239. extern ClientData descMapDataPtr;        /* Descriptor map of file system. */
  240. extern LfsDescMapCheckPoint *descMapCheckPointPtr; /* Most current descriptor map 
  241.                          * check point. */
  242.  
  243. ClientData   usageArrayDataPtr;    /* Data of usage map. */
  244.  
  245. /*
  246.  * BlockToSegmentNum() - Macro to convert from file system block numbers to 
  247.  *                   segment numbers.
  248.  */
  249. #define    BlockToSegmentNum(block) (((block)-superBlockPtr->hdr.logStartOffset)/\
  250.             (superBlockPtr->usageArray.segmentSize/blockSize))
  251.  
  252. /*
  253.  *    DescMapEntry() - Return the descriptor map entry for a file number.
  254.  *    UsageArrayEntry() - Return an usage array entry for a segment number.
  255.  *    DescMapBlockIndex() - Return the block index of a desc map block.
  256.  *    UsageArrayBlockIndex() - Return the block index of a usage array block.
  257.  *    
  258.  */
  259.  
  260. #define    DescMapEntry(fileNumber) ((LfsDescMapEntry *) GetStableMemEntry(descMapDataPtr, fileNumber))
  261. #define    UsageArrayEntry(segNo) ((LfsSegUsageEntry *) GetStableMemEntry(usageArrayDataPtr, segNo))
  262.  
  263. #define DescMapBlockIndex(blockNum) GetStableMemBlockIndex(descMapDataPtr, blockNum)
  264. #define UsageArrayBlockIndex(blockNum) GetStableMemBlockIndex(usageArrayDataPtr, blockNum)
  265.  
  266. #endif _FSCHECK
  267.